package br.edu.unirn.main;

import java.util.List;
import java.util.Random;
import java.util.Scanner;

import br.edu.unirn.dao.AposentoDAO;
import br.edu.unirn.dao.HospedeDAO;
import br.edu.unirn.dao.HotelDAO;
import br.edu.unirn.dao.ReservaDAO;
import br.edu.unirn.model.Aposento;
import br.edu.unirn.model.Endereco;
import br.edu.unirn.model.Hospede;
import br.edu.unirn.model.Hotel;
import br.edu.unirn.model.Reserva;
import br.edu.unirn.model.Telefone;

public class Principal {

	private static Hospede hospede;
	private static Scanner ler;

	public static void main(String[] args) throws Exception {

		boolean continua = true;
		ler = new Scanner(System.in);
		persistirValores();
		

		while (continua) {

			System.out.println("1 - Persistir Valores.");
			
			System.out.println("2 - Criteria findAllReservaByHospedeAndPreco.");
			System.out.println("3 - Criteria findReservaByPrecoTotal.");
			
			System.out.println("4 - JPQL findHospedeByIdadeMaior.");
			System.out.println("5 - JPQL findHospedeByIdadeBetweenMaxAndMin.");
			System.out.println("6 - JPQL findHospedeByNomeAndIdade.");
			System.out.println("7 - JPQL findHospedeByEnderecoIsEmpty.");

			System.out.println("0 - Finalizar.");

			int op = Integer.parseInt(ler.next());

			switch (op) {
			case 1:
				persistirValores();
				break;

			case 2:
				findAllReservaByHospedeAndPreco();
				break;

			case 3:
				findReservaByPrecoTotal();
				break;

			case 4:
				findHospedeByIdadeMaior();
				break;

			case 5:
				findHospedeByIdadeBetweenMaxAndMin();
				break;

			case 6:
				findHospedeByNomeAndIdade();
				break;

			case 7:
				findHospedeByEnderecoIsEmpty();
				break;

			case 0:
				continua = false;
				break;
			}
		}
	}
	
	//Recupera preco de todas as reservas
	public static void findAllReservaByHospedeAndPreco(){
		ReservaDAO reservaDAO = new ReservaDAO();
		
		for (Object[] registro : reservaDAO.findAllReservaByHospedeAndPreco()) {
			System.out.println(registro[0]);
			System.out.println("Preço:"+registro[1]);
		}
	}
	
	//Calcula o valor total das reservas
	public static void findReservaByPrecoTotal(){
		ReservaDAO reservaDAO = new ReservaDAO();
		
		System.out.println("Preço Total: "+reservaDAO.findReservaByPrecoTotal());
	}

	//Recupera os hospedes com idades superior ao valor passado.
	public static void findHospedeByIdadeMaior() {
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite a idade:");
		int idade = ler.nextInt();
		for (Hospede hospedes : dao.findHospedeByIdadeMaior(idade)) {
			System.out.println(hospedes.toString());
		}
	}
	
	//Recupera hospedes entre faixas de idades.
	public static void findHospedeByIdadeBetweenMaxAndMin(){
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite a idade mínima:");
		int minimo = ler.nextInt();
		System.out.println("Digite a idade maxima:");
		int maximo = ler.nextInt();
		for (Hospede hospedes : dao.findHospedeByIdadeBetweenMaxAndMin(minimo, maximo)) {
			System.out.println(hospedes.toString());
		}
	}
	
	//Recupera os hospedes pelo nome e idade diferente.
	public static void findHospedeByNomeAndIdade(){
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite o nome:");
		String nome = ler.next();
		System.out.println("Digite a idade:");
		int idade = ler.nextInt();
		for (Hospede hospedes : dao.findHospedeByNomeAndIdade(nome, idade)) {
			System.out.println(hospedes.toString());
		}
	}
	
	//Retorna os hospedes que não possuem endereço
	public static void findHospedeByEnderecoIsEmpty(){
		HospedeDAO dao = new HospedeDAO();
		for(Hospede hospedes : dao.findHospedeByEnderecoIsEmpty()){
			System.out.println(hospedes.toString());
		}
	}
	
	//Classe principal que persista informações iniciais no projeto.
	public static void persistirValores() {
		Random gerador = new Random();
		
		HospedeDAO hospedeDAO = new HospedeDAO();
		HotelDAO hotelDAO = new HotelDAO();
		ReservaDAO reservaDAO = new ReservaDAO();
		
		Endereco endereco;
		Telefone telefone;
		Reserva reserva;
		Hotel hotel;
		Aposento aposento;
		
		for (int i = 1; i < 8; i++) {
			//criando entidades
			hospede = new Hospede();
			endereco = new Endereco();
			telefone = new Telefone();
			reserva = new Reserva();
			hotel = new Hotel();
			aposento = new Aposento();
			
			//setando hospede
			hospede.setCpf("095605084"+gerador.nextInt(300));
			hospede.setNome("Hospede "+i);
			hospede.setIdade(gerador.nextInt(100));
			
			//setando endereco
			endereco.setBairro("Bairro "+i);
			endereco.setRua("Rua "+i);
			hospede.setEndereco(endereco);
			
			//setando telefone
			telefone.setDdd(gerador.nextInt(100)+i);
			telefone.setNumero(gerador.nextInt(100)+ "-" + gerador.nextInt(100));
			hospede.getTelefones().add(telefone);
			
			//persistindo hospede
			hospedeDAO.create(hospede);
			
			//setando hotel e aposento
			hotel.setStars(gerador.nextInt(8));
			aposento.setTipoAposento("Tipo "+i);
			hotel.getAposentos().add(aposento);
			
			//persistindo hotel
			hotelDAO.create(hotel);
			
			//setando reserva
			reserva.setHospede(hospede);
			reserva.setHotel(hotel);
			reserva.setAposento(aposento);
			reserva.setPreco(gerador.nextDouble()*100);
			
			//persistindo reserva
			reservaDAO.create(reserva);
		}
	}
}
